import requests
from config.Peizhi import Bzkg
from datetime import datetime

# 从配置文件中导入 Bzkg 类并实例化，用于获取压力阈值等配置信息
bzkg = Bzkg()

# Django REST framework API地址
API_URL = "http://222.134.245.144:17000/weizhang/VioModel/"

# 定义一个函数，用于将故障信息推送到 REST API
def send_fault_to_api(fault_info):
    """推送故障信息到REST API"""
    try:
        # 发送 POST 请求，将故障信息以 JSON 格式发送到指定的 API 地址
        response = requests.post(API_URL, json=fault_info)
        if response.status_code == 201:
            # 如果请求成功（状态码为 201），打印成功推送的信息
            print(f"✅ 故障推送成功：{fault_info['gu_zhang_miao_shu']}")
        else:
            # 如果请求失败，打印失败信息，包含状态码和响应内容
            print(f"❌ 推送失败，状态码：{response.status_code}，响应：{response.text}")
    except requests.exceptions.RequestException as e:
        # 如果请求过程中出现异常，打印异常信息
        print(f"🚫 网络请求失败：{str(e)}")

# 定义一个函数，用于从 API 获取数据
def get_data_from_api():
    # API 的 URL 地址
    api_url = "http://222.134.245.144:17000/chuanganqi/BopPanelModel/"
    try:
        # 发送 GET 请求获取数据
        response = requests.get(api_url)
        # 检查响应状态，如果状态码不是 200，会抛出异常
        response.raise_for_status()
        # 将响应内容转换为 JSON 格式并返回
        return response.json()
    except requests.RequestException as e:
        # 如果请求过程中出现异常，打印错误信息并返回 None
        print(f"获取数据失败: {e}")
        return None

# 定义一个函数，用于获取主泵和副泵的名称
def bengdata():
    # API 的 URL 地址
    url = "http://222.134.245.144:17000/chuanganqi/FieldConfigModel/"
    # 发送 GET 请求获取数据
    response = requests.get(url)
    if response.status_code == 200:
        # 如果请求成功，将响应内容转换为 JSON 格式
        data = response.json()
        # 获取结果列表
        results = data.get("results", [])
        if results and isinstance(results, list):
            # 用于存储泵名称的列表
            pump_names = []
            for result in results:
                # 获取主副泵相关数据
                zhufubeng_data = result.get("zhufubeng", [])
                for pump_info in zhufubeng_data:
                    # 获取泵的类型（主泵或副泵）
                    pump_type = pump_info["pump"]
                    # 获取泵的名称
                    pump_name = pump_info["name"]
                    if pump_type == "主泵":
                        # 如果是主泵，将名称和类型组合添加到列表中
                        pump_names.append(f"{pump_name}-主泵")
                    elif pump_type == "副泵":
                        # 如果是副泵，将名称和类型组合添加到列表中
                        pump_names.append(f"{pump_name}-副泵")
            if len(pump_names) >= 2:
                # 如果列表中至少有两个元素，返回前两个元素
                return pump_names[0], pump_names[1]
            else:
                # 如果列表元素不足，返回默认的未知名称
                return "未知主泵", "未知副泵"
        else:
            # 如果未找到有效的主副泵数据，打印提示信息并返回未定义名称
            print("未找到有效的 zhufubeng 数据")
            return "未定义主泵", "未定义副泵"
    else:
        # 如果请求失败，打印失败信息并返回请求失败的名称
        print(f"请求失败，状态码: {response.status_code}")
        return "请求失败主泵", "请求失败副泵"

# 定义一个函数，用于检查泵的压力开关是否正常，并将故障信息推送到 API
def yalioff():
    # 调用 get_data_from_api 函数获取数据
    data = get_data_from_api()
    if not data:
        # 如果未获取到数据，直接返回
        return
    # 获取结果列表
    results = data.get("results", [])
    # 获取最新的结果
    latest_result = results[0]
    # 从获取的数据中提取储能器压力，并转换为整数类型
    a = latest_result.get("chu_neng_qi_ya_li")
    accumulator_pressure = int(a)
    # 从获取的数据中提取 1# 泵和 2# 泵的状态
    beng1 = latest_result.get("dian_beng_1")
    beng2 = latest_result.get("dian_beng_2")
    device_id1 = beng1.get("deng")
    device_id2 = beng2.get("deng")
    # 调用 bengdata 函数获取主泵和副泵的名称
    zhu, fu = bengdata()
    if zhu == "1#pump-主泵":
        # 如果主泵名称是 "1#pump-主泵"，构造包含主泵和副泵状态的数据字典
        data = {"pump_main": device_id1, "pump_f": device_id2}
    else:
        # 否则，交换主泵和副泵的状态，构造数据字典
        data = {"pump_f": device_id1, "pump_main": device_id2}
    # 打印储能器压力、主泵和副泵的灯状态
    print("储能器压力值:", accumulator_pressure, f"主泵的灯:", data["pump_main"], f"副泵的灯:", data["pump_f"])
    # 判断主泵压力开关：当储能器压力小于等于配置文件中的 yali1 阈值，且主泵状态为不亮（False）时
    if accumulator_pressure <= bzkg.yali1 and not data["pump_main"]:
        print("主泵压力开关损坏或调校不准")
        # 构造主泵压力开关故障信息
        fault_info = {
            "gu_zhang_ming_cheng": "主泵压力开关损坏或调校不准",
            "she_bei_ming_cheng": "主泵",
            "she_bei_qu_yu": "泵组",
            "gu_zhang_shi_jian": datetime.now().strftime("%Y-%m-%dT%H:%M:%S"),
            "gu_zhang_lei_xing": "压力开关故障",
            "shi_ji_zhi": accumulator_pressure,
            "gao_jing_zhi": bzkg.yali1,
            "gu_zhang_miao_shu": f"储能器压力为 {accumulator_pressure}，小于等于阈值 {bzkg.yali1} 时，主泵未启动",
            "chu_li_zhuang_tai": "未处理"
        }
        # 调用 send_fault_to_api 函数推送故障信息
        send_fault_to_api(fault_info)
    # 判断副泵压力开关：当储能器压力小于等于配置文件中的 yali2 阈值，且副泵状态为不亮（False）时
    elif accumulator_pressure <= bzkg.yali2 and not data["pump_f"]:
        print("副泵压力开关损坏或调校不准")
        # 构造副泵压力开关故障信息
        fault_info = {
            "gu_zhang_ming_cheng": "副泵压力开关损坏或调校不准",
            "she_bei_ming_cheng": "副泵",
            "she_bei_qu_yu": "泵组",
            "gu_zhang_shi_jian": datetime.now().strftime("%Y-%m-%dT%H:%M:%S"),
            "gu_zhang_lei_xing": "压力开关故障",
            "shi_ji_zhi": accumulator_pressure,
            "gao_jing_zhi": bzkg.yali2,
            "gu_zhang_miao_shu": f"储能器压力为 {accumulator_pressure}，小于等于阈值 {bzkg.yali2} 时，副泵未启动",
            "chu_li_zhuang_tai": "未处理"
        }
        # 调用 send_fault_to_api 函数推送故障信息
        send_fault_to_api(fault_info)
    # 判断主副泵同时亮起情况：当储能器压力大于等于配置文件中的 yali3 阈值，且主泵或副泵状态为亮（True）时
    elif accumulator_pressure >= bzkg.yali3 and (data["pump_main"] or data["pump_f"]):
        print("存在泵压力开关损坏或调校不准")
        # 构造主副泵同时运行故障信息
        fault_info = {
            "gu_zhang_ming_cheng": "存在泵压力开关损坏或调校不准",
            "she_bei_ming_cheng": "泵组",
            "she_bei_qu_yu": "泵组",
            "gu_zhang_shi_jian": datetime.now().strftime("%Y-%m-%dT%H:%M:%S"),
            "gu_zhang_lei_xing": "压力开关故障",
            "shi_ji_zhi": accumulator_pressure,
            "gao_jing_zhi": bzkg.yali3,
            "gu_zhang_miao_shu": f"储能器压力为 {accumulator_pressure}，大于等于阈值 {bzkg.yali3} 时，主泵或副泵仍在运行",
            "chu_li_zhuang_tai": "未处理"
        }
        # 调用 send_fault_to_api 函数推送故障信息
        send_fault_to_api(fault_info)
    else:
        # 如果未检测到故障，打印压力开关状态正常的信息
        print("压力开关状态正常")

# 调用 yalioff 函数进行压力开关检查
yalioff()